/**
 *
 */
package com.zhuoyue.elmt.service;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.eit.eitsite.common.config.Global;
import com.eit.eitsite.common.service.BaseService;
import com.eit.eitsite.common.utils.IdGen;
import com.eit.eitsite.modules.sys.dao.MenuDao;
import com.eit.eitsite.modules.sys.dao.OfficeDao;
import com.eit.eitsite.modules.sys.dao.RoleDao;
import com.eit.eitsite.modules.sys.dao.UserDao;
import com.eit.eitsite.modules.sys.entity.Area;
import com.eit.eitsite.modules.sys.entity.Office;
import com.eit.eitsite.modules.sys.entity.Role;
import com.eit.eitsite.modules.sys.entity.User;
import com.eit.eitsite.modules.sys.service.OfficeService;
import com.eit.eitsite.modules.sys.service.SystemService;
import com.eit.eitsite.modules.sys.utils.UserUtils;
import com.google.common.collect.Lists;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.eit.eitsite.common.persistence.Page;
import com.eit.eitsite.common.service.CrudService;
import com.zhuoyue.elmt.entity.GgZgdw;
import com.zhuoyue.elmt.dao.GgZgdwDao;

/**
 * 资格单位信息Service
 *
 * @author chenhao
 * @version 2016-09-08
 */
@Service
@Transactional(readOnly = true)
public class GgZgdwService extends CrudService<GgZgdwDao, GgZgdw> {

    @Autowired
    private OfficeService officeService;

    @Autowired
    private RoleDao roleDao;

    @Autowired
    private UserDao userDao;

    @Autowired
    private OfficeDao officeDao;

    @Autowired
    private SystemService systemService;

    public GgZgdw get(String id) {
        return super.get(id);
    }

    public GgZgdw getByCode(GgZgdw ggZgdw) {
        return dao.getByCode(ggZgdw);
    }

    public List<GgZgdw> findList(GgZgdw ggZgdw) {
        return super.findList(ggZgdw);
    }

    public Page<GgZgdw> findPage(Page<GgZgdw> page, GgZgdw ggZgdw) {
        return super.findPage(page, ggZgdw);
    }

    @Transactional(readOnly = false)
    public void save(GgZgdw ggZgdw) {
        super.save(ggZgdw);
    }

    @Transactional(readOnly = false)
    public void delete(GgZgdw ggZgdw) {
        super.delete(ggZgdw);
    }

    @Transactional(readOnly = false)
    public void initaccess(GgZgdw ggZgdw) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        // 单位接入
        // 根据维保单位 创建机构
        Office prentOffice = new Office();
        prentOffice.setId("2"); // 放到机构中的维保单位列表下 Id为2

        Area area = new Area();
        area.setId("1"); // 1为深圳

        List<Office> officeList = new ArrayList();
        Office office = new Office();
        office.setName(ggZgdw.getDwmc());
        office.setCode(ggZgdw.getZzjqdm());
        office.setParent(prentOffice);
        office.setArea(area);
        office.setType("1"); // 维保单位
        office.setGrade("1");
        office.setUseable(Global.YES);
        officeService.save(office);

        officeList.add(office);

        // 创建 单位超级管理人员 用户
        User user = new User();
        user.setCompany(new Office(office.getId())); // 归属公司
        user.setOffice(new Office(office.getId())); // 归属部门
        user.setPassword(SystemService.entryptPassword(ggZgdw.getZzjqdm())); // 密码
        user.setNo(ggZgdw.getZzjqdm()); // 工号
        user.setName(ggZgdw.getZzjqdm()); // 姓名
        user.setLoginName(ggZgdw.getZzjqdm()); // 登录名
        user.setWorkType("1"); // 在职状态
        user.setLoginFlag("1"); // 是否允许登录
        user.setUserType("4");  // 用户类型 单位超级管理人员

        // 角色为 单位超级管理人员 后面再进行更新
        Role role = new Role();
        role.setId("4");

        // 角色数据有效性验证
        List<Role> roleList = Lists.newArrayList();
        roleList.add(role);

        user.setRoleList(roleList);
        // 保存用户信息
        systemService.saveUser(user);

        Date curDate = new Date();
        // 根据 单位超级管理人员 创建 超级管理人员 管理人员和维保人员 默认角色 授权

        Role superRole = systemService.getRole("4"); // 已经定义好的管理人员的角色
        Role newSuperRole = new Role();
        PropertyUtils.copyProperties(newSuperRole, superRole);
        newSuperRole.setName(newSuperRole.getName() + "-" + ggZgdw.getZzjqdm() + "-0001");
        newSuperRole.setEnname(ggZgdw.getZzjqdm() + "-0001");
        newSuperRole.setCreateBy(user);
        newSuperRole.setUpdateBy(user);
        newSuperRole.setCreateDate(curDate);
        newSuperRole.setUpdateDate(curDate);
        newSuperRole.setId(null);
        newSuperRole.setOffice(office);
        newSuperRole.setOfficeList(officeList);
        insertRole(newSuperRole);

        Role magRole = systemService.getRole("2"); // 已经定义好的管理人员的角色
        Role magNewRole = new Role();
        PropertyUtils.copyProperties(magNewRole, magRole);
        magNewRole.setName(magNewRole.getName() + "-" + ggZgdw.getZzjqdm() + "-0002");
        magNewRole.setEnname(ggZgdw.getZzjqdm() + "-0002");
        magNewRole.setCreateBy(user);
        magNewRole.setUpdateBy(user);
        magNewRole.setCreateDate(curDate);
        magNewRole.setUpdateDate(curDate);
        magNewRole.setId(null);
        magNewRole.setOffice(office);
        magNewRole.setOfficeList(officeList);
        insertRole(magNewRole);

        Role wbRole = systemService.getRole("3"); // 已经定义好的维保人员的角色
        Role wbNewRole = new Role();
        PropertyUtils.copyProperties(wbNewRole, wbRole);
        wbNewRole.setName(wbNewRole.getName() + "-" + ggZgdw.getZzjqdm() + "-0003");
        wbNewRole.setEnname(ggZgdw.getZzjqdm() + "-0003");
        wbNewRole.setCreateBy(user);
        wbNewRole.setUpdateBy(user);
        wbNewRole.setCreateDate(curDate);
        wbNewRole.setUpdateDate(curDate);
        wbNewRole.setId(null);
        wbNewRole.setOffice(office);
        wbNewRole.setOfficeList(officeList);
        insertRole(wbNewRole);

        // 更新用户角色为单位自己的角色
        roleList = Lists.newArrayList();
        roleList.add(newSuperRole);

        user.setRoleList(roleList);
        // 保存用户信息
        systemService.saveUser(user);

        // 更新资格单位的状态
        ggZgdw.setStatus("1");
        dao.update(ggZgdw);
    }

    @Transactional(readOnly = false)
    public void removeaccess(GgZgdw ggZgdw) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        // 单位接入
        // 根据维保单位 创建机构
        Office qryOffice = new Office();
        qryOffice.setCode(ggZgdw.getZzjqdm());

        Office office = officeService.getByCode(qryOffice);
        List<User> userList = systemService.findUserByOfficeId(office.getId());

        for (User user : userList) {
            Role role = new Role();
            user = systemService.getUser(user.getId());
            role.setUser(user);
            List<Role> tmpRoleList = roleDao.findList(role);

            User qryRoleUser = new User();
            PropertyUtils.copyProperties(qryRoleUser, user);
            qryRoleUser.setId("");
            qryRoleUser.setLoginName("");
            qryRoleUser.setRoleList(tmpRoleList);
            role.getSqlMap().put("dsf", BaseService.dataScopeFilter(qryRoleUser, "o", "u"));
            role.setUser(qryRoleUser);
            List<Role> roleList = roleDao.findList(role);
            for (Role retrole : roleList) {
                roleDao.deleteRoleMenu(retrole);
                roleDao.deleteRoleOffice(retrole);
                roleDao.deleteReal(retrole);
            }

            userDao.deleteUserRole(user);
            userDao.deleteReal(user);
        }
        officeDao.deleteReal(office);

        // 更新资格单位的状态
        ggZgdw.setStatus("0");
        dao.update(ggZgdw);
    }

    public void insertRole(Role role) {
        role.setId(IdGen.uuid());

        roleDao.insert(role);

        // 更新角色与菜单关联
        roleDao.deleteRoleMenu(role);
        if (role.getMenuList().size() > 0) {
            roleDao.insertRoleMenu(role);
        }
        // 更新角色与部门关联
        roleDao.deleteRoleOffice(role);
        if (role.getOfficeList().size() > 0) {
            roleDao.insertRoleOffice(role);
        }
        // 清除用户角色缓存
        UserUtils.removeCache(UserUtils.CACHE_ROLE_LIST);
    }

}